#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QComboBox>
#include <QPushButton>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QTextBrowser>
#include <QLineEdit>
#include <QFrame>
#include <QSerialPort>
#include <QMessageBox>
#include <QMenuBar>
#include <QDebug>
#include <QDateTime>
#include <QTimerEvent>
#include <QTimer>
#include <QTcpSocket>
#include "sendtestpage.h"
#include "paramsetandread.h"
#include "oopoperation.h"
#include "global_var.h"
#include "protocol645.h"
#include "newthread645.h"
class MainWindow : public QMainWindow
{
    Q_OBJECT
public :
    void menu_add();
signals:
    void needToShowSignal();
public slots:
    void serial_open_slot();
    void serial_close_slot();
    void on_serial_read_slot();  //串口读槽。
    void on_serial_write_slot();  //串口写槽。
    void show_Log_slot();
    void  clear_log_out();  // 清除 log 展示。
    void  open_log_analyse();  // 控制 log 展示。
    void  open_sql_analyse();  // 清除 log 展示。
    void  update_meter_timer_slot();
    //menu 点击后的槽
    void  showAbout_slot(QAction *action);
    void  show_Operator_slot(QAction *action);
    void open_network_slot();  // 打开网络的槽
    void close_network_slot();  //关闭网络的槽

    //网络 槽函数
    void slot_netreadData();
    void slot_netwriteData();
    void slot_connected();
    void  slot_disconnected();
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void timerEvent(QTimerEvent *e);
private:
    QLabel  *label_serial_port;
    QLabel  *label_serial_baud;
    QLabel  *label_serial_parity;
    QLabel  *label_serial_data;
    QLabel  *label_serial_stop;

    QComboBox  *commbox_serial_port;
    QComboBox  *commbox_serial_baud;
    QComboBox  *commbox_serial_parity;
    QComboBox  *commbox_serial_data;
    QComboBox  * commbox_serial_stop;

    QPushButton   *pushButton_open_port;
    QPushButton  *pushButton_close_port;
    QPushButton  * pushButton_clearLogOut;
    QPushButton  * pushButton_LogAnalyse;
    QCheckBox    *showAsciiShow;
    QLabel    * socketConnectState;
    QTcpSocket   *tcpClient;   //tcp 客户端
    QTextBrowser  *textshow;
    QTextBrowser  *textshowAnalyse;
    QLabel          *meter_time;   //展示虚拟表的时间
    QLabel          *meter_run_time; //展示虚拟表打开后一共运行的时间。
    QFrame* QFrame_line;  //分割线

    //network 控件
    QLabel* network_ip_label;
    QLineEdit* network_ip;
    QLabel* network_port_label;
    QLineEdit* network_port;
    QPushButton* network_connect;
    QPushButton* network_close;
    QCheckBox    *network_connect_repeat;
    INT8U  connectIsValid;
    //布局变量
    QWidget    *main_widget;
    QGridLayout *serial_config_layout;
    QGridLayout *network_config_layout;   //network 连接布局
    QGridLayout  * main_grid_interface;
    QGridLayout  *meter_time_layout;    //右下角系统时间，表运行时间布局
    //整个串口对象
    QSerialPort *serialObj;
    //menu 菜单
    QMenuBar* pMenuBar;
    QMenu * menuFile;
    QMenu* menuOperation;
    QMenu *menuHelp;


  //页面显示
    sendtestpage  *sendtestpage1;
    ParamSetAndRead * paramsetread;
    oopOperation    *oop_operation;
    protocol645    *operation_645;
    QAction  *action_network;
    QAction  *action_sendTest;  //报文收发测试界面。
    QAction  *actionAbout;
    QAction  *actionParamSetRead;  //376参数设置与读取页面。
    QAction  *actionOopOperation;  //OOP 操作界面。
    QAction  *action645Operation;  //645操作界面。
    //收发字节数
    QLabel  *serial_rx_cnt;
    QLabel  *serial_tx_cnt;


    //定时器
    int timerid1,timerid2;
    int serialIntCnt;  // 串口中断次数，5次就是50ms超时时间到，需要打印出来。

    protocol13761  protocol376;
    protocol_oop   protocoloop;
    protocol645   protocol645Imp;

   newThread645  thread645;
};
#endif // MAINWINDOW_H
